package com.example.stmp.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * ArrayList<String>转String类型处理器
 * 用于数据库存储时将ArrayList转换为逗号分隔字符串
 * 读取时将字符串转换为ArrayList
 */
@MappedTypes(ArrayList.class)       // 处理ArrayList类型
@MappedJdbcTypes(JdbcType.VARCHAR)   // 对应数据库VARCHAR类型
public class ArrayListToStringTypeHandler extends BaseTypeHandler<List<String>> {

    /**
     * 将ArrayList<String>转换为字符串存入数据库
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        if (parameter == null || parameter.isEmpty()) {
            ps.setString(i, "");  // 存储空字符串而非null，避免数据库null值问题
            return;
        }

        // 使用逗号拼接字符串，去除元素前后空格
        String joined = String.join(",", parameter.stream()
                .map(String::trim)
                .filter(s -> !s.isEmpty())  // 过滤空字符串
                .toList());
        ps.setString(i, joined);
    }

    /**
     * 从数据库读取字符串转换为ArrayList<String>
     */
    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String str = rs.getString(columnName);
        return stringToArrayList(str);
    }

    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String str = rs.getString(columnIndex);
        return stringToArrayList(str);
    }

    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String str = cs.getString(columnIndex);
        return stringToArrayList(str);
    }

    /**
     * 字符串转ArrayList辅助方法
     */
    private ArrayList<String> stringToArrayList(String str) {
        if (str == null || str.trim().isEmpty()) {
            return new ArrayList<>();
        }

        // 按逗号分割，支持逗号前后带空格的情况
        return new ArrayList<>(Arrays.stream(str.split("\\s*,\\s*"))
                .filter(s -> !s.isEmpty())  // 过滤空字符串
                .toList());
    }
}
